package com.wlx.system.service.impl;

import com.wlx.common.core.constant.Constants;
import com.wlx.common.core.utils.StringUtils;
import com.wlx.common.redis.service.RedisService;
import com.wlx.system.domain.SysApplication;
import com.wlx.system.mapper.SysApplicationMapper;
import com.wlx.system.service.ISysApplicationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 系统应用 服务层实现
 *
 * @author wlx
 */
@Service
public class SysApplicationServiceImpl implements ISysApplicationService {

    @Autowired
    private SysApplicationMapper sysApplicationMapper;

    @Autowired
    private RedisService redisService;

    @PostConstruct
    @Override
    public List<String> queryAndCacheList() {
        List<String> cacheList = redisService.getCacheList(Constants.APP_LIST_KEY);
        if (StringUtils.isNull(cacheList) || cacheList.size() == 0) {
            List<SysApplication> applications = sysApplicationMapper.selectAppIds();
            List<String> appIds = applications.stream().map(SysApplication::getAppId).collect(Collectors.toList());
            if (StringUtils.isNotNull(appIds) && appIds.size() > 0) {
                //将应用信息存入缓存
                redisService.setCacheList(Constants.APP_LIST_KEY, appIds);
            } else {
                redisService.deleteObject(Constants.APP_LIST_KEY);
            }
            cacheList = appIds;
        }
        return cacheList;
    }


    /**
     * 查询应用信息 应用：指调用当前系统所提供服务的应用或系统；
     *
     * @param id 应用信息 应用：指调用当前系统所提供服务的应用或系统；ID
     * @return 应用信息 应用：指调用当前系统所提供服务的应用或系统；
     */
    @Override
    public SysApplication selectSysApplicationById(Long id) {
        return sysApplicationMapper.selectSysApplicationById(id);
    }

    /**
     * 查询应用信息 应用：指调用当前系统所提供服务的应用或系统；列表
     *
     * @param sysApplication 应用信息 应用：指调用当前系统所提供服务的应用或系统；
     * @return 应用信息 应用：指调用当前系统所提供服务的应用或系统；
     */
    @Override
    public List<SysApplication> selectSysApplicationList(SysApplication sysApplication) {
        return sysApplicationMapper.selectSysApplicationList(sysApplication);
    }

    /**
     * 新增应用信息 应用：指调用当前系统所提供服务的应用或系统；
     *
     * @param sysApplication 应用信息 应用：指调用当前系统所提供服务的应用或系统；
     * @return 结果
     */
    @Override
    public int insertSysApplication(SysApplication sysApplication) {
        sysApplication.init();
        int i = sysApplicationMapper.insertSysApplication(sysApplication);
        if (i == 1) {
            redisService.deleteObject(Constants.APP_LIST_KEY);
            queryAndCacheList();
        }
        return i;
    }

    /**
     * 修改应用信息 应用：指调用当前系统所提供服务的应用或系统；
     *
     * @param sysApplication 应用信息 应用：指调用当前系统所提供服务的应用或系统；
     * @return 结果
     */
    @Override
    public int updateSysApplication(SysApplication sysApplication) {
        int i = sysApplicationMapper.updateSysApplication(sysApplication);
        if (i == 1) {
            redisService.deleteObject(Constants.APP_LIST_KEY);
            queryAndCacheList();
        }
        return i;
    }

    /**
     * 批量删除应用信息 应用：指调用当前系统所提供服务的应用或系统；
     *
     * @param ids 需要删除的应用信息 应用：指调用当前系统所提供服务的应用或系统；ID
     * @return 结果
     */
    @Override
    public int deleteSysApplicationByIds(Long[] ids) {
        int i = sysApplicationMapper.deleteSysApplicationByIds(ids);
        if (i == 1) {
            redisService.deleteObject(Constants.APP_LIST_KEY);
            queryAndCacheList();
        }
        return i;
    }

    /**
     * 删除应用信息 应用：指调用当前系统所提供服务的应用或系统；信息
     *
     * @param id 应用信息 应用：指调用当前系统所提供服务的应用或系统；ID
     * @return 结果
     */
    @Override
    public int deleteSysApplicationById(Long id) {
        int i = sysApplicationMapper.deleteSysApplicationById(id);
        if (i == 1) {
            redisService.deleteObject(Constants.APP_LIST_KEY);
            queryAndCacheList();
        }
        return i;
    }
}
